Program Listing for File feature_manager.h

Return to documentation for file (codes/slam/estimator/feature_manager.h)

/*******************************************************
 * Copyright (C) 2019, Robotics Group, Nanyang Technology University
 *
 * \file feature_manager.h
 * \author Zhang Handuo (hzhang032@e.ntu.edu.sg)
 * \date Januarary 2017
 * \brief SSLAM-estimator feature database.
 *
 * Licensed under the GNU General Public License v3.0;
 * you may not use this file except in compliance with the License.
 *
 *******************************************************/

#ifndef FEATURE_MANAGER_H
#define FEATURE_MANAGER_H

#include <list>
#include <algorithm>
#include <vector>
#include <numeric>
using namespace std;

#include <eigen3/Eigen/Dense>

using namespace Eigen;

#include <ros/console.h>
#include <ros/assert.h>

#include "parameters.h"
#include "../utility/tic_toc.h"

namespace slam_estimator {

    class FeaturePerFrame {
    public:
#ifndef DOXYGEN_SHOULD_SKIP_THIS

        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#endif /* DOXYGEN_SHOULD_SKIP_THIS */

        FeaturePerFrame(const Eigen::Matrix<double, 7, 1> &_point, double td) {
            point.x() = _point(0);
            point.y() = _point(1);
            point.z() = _point(2);
            uv.x() = _point(3);
            uv.y() = _point(4);
            velocity.x() = _point(5);
            velocity.y() = _point(6);
            cur_td = td;
            is_stereo = false;
        }

        void rightObservation(const Eigen::Matrix<double, 7, 1> &_point) {
            pointRight.x() = _point(0);
            pointRight.y() = _point(1);
            pointRight.z() = _point(2);
            uvRight.x() = _point(3);
            uvRight.y() = _point(4);
            velocityRight.x() = _point(5);
            velocityRight.y() = _point(6);
            is_stereo = true;
        }

        double cur_td;
        Vector3d point;
        Vector3d pointRight;
        Vector2d uv;
        Vector2d uvRight;

        Vector2d velocity;

        Vector2d velocityRight;

        bool is_stereo;
    };

    class FeaturePerId {
    public:
#ifndef DOXYGEN_SHOULD_SKIP_THIS

        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#endif /* DOXYGEN_SHOULD_SKIP_THIS */

        const int feature_id;

        int start_frame;

        vector<FeaturePerFrame> feature_per_frame;

        int used_num;

        double estimated_depth;

        int solve_flag;


        FeaturePerId(int _feature_id, int _start_frame)
                : feature_id(_feature_id), start_frame(_start_frame),
                  used_num(0), estimated_depth(-1.0), solve_flag(0) {
        }

        int endFrame();
    };

    class FeatureManager {
    public:
        #ifndef DOXYGEN_SHOULD_SKIP_THIS
            EIGEN_MAKE_ALIGNED_OPERATOR_NEW
        #endif /* DOXYGEN_SHOULD_SKIP_THIS */

        explicit FeatureManager(Matrix3d _Rs[]);

        void setRic(Matrix3d _ric[]);

        void clearState();

        int getFeatureCount();

        bool
        addFeatureCheckParallax(int frame_count, const map<int, vector<pair<int, Eigen::Matrix<double, 7, 1>>>> &image,
                                double td);

        vector<pair<Vector3d, Vector3d>> getCorresponding(int frame_count_l, int frame_count_r);

        //void updateDepth(const VectorXd &x);

        void setDepth(const VectorXd &x);

        void removeFailures();

        void clearDepth();

        VectorXd getDepthVector();

        void triangulate(int frameCnt, Vector3d Ps[], Matrix3d Rs[], Vector3d tic[], Matrix3d ric[]);

        void triangulatePoint(Eigen::Matrix<double, 3, 4> &Pose0, Eigen::Matrix<double, 3, 4> &Pose1,
                              Eigen::Vector2d &point0, Eigen::Vector2d &point1, Eigen::Vector3d &point_3d);

        void initFramePoseByPnP(int frameCnt, Vector3d Ps[], Matrix3d Rs[], Vector3d tic[], Matrix3d ric[]);

        bool solvePoseByPnP(Eigen::Matrix3d &R_initial, Eigen::Vector3d &P_initial,
                            vector<cv::Point2f> &pts2D, vector<cv::Point3f> &pts3D);

        void removeBackShiftDepth(const Eigen::Matrix3d &marg_R, const Eigen::Vector3d marg_P,
                                  const Eigen::Matrix3d new_R, const Eigen::Vector3d new_P);

        void removeBack();

        void removeFront(int frame_count);

        void removeOutlier(set<int> &outlierIndex);

        list<FeaturePerId> feature;

        int last_track_num;
        double last_average_parallax;

        int new_feature_num;
        int long_track_num;

    private:
        static double compensatedParallax2(const FeaturePerId &it_per_id, int frame_count);

        const Matrix3d *Rs;
        Matrix3d ric[2];
    };
}

#endif